/**
 * 我们正在玩一个猜数游戏，游戏规则如下：
 *
 * 我从 1 到 n 之间选择一个数字。
 * 你来猜我选了哪个数字。
 * 如果你猜到正确的数字，就会 赢得游戏 。
 * 如果你猜错了，那么我会告诉你，我选的数字比你的 更大或者更小 ，并且你需要继续猜数。
 * 每当你猜了数字 x 并且猜错了的时候，你需要支付金额为 x 的现金。如果你花光了钱，就会 输掉游戏 。
 * 给你一个特定的数字 n ，返回能够 确保你获胜 的最小现金数，不管我选择那个数字 。
 */
public class Test375 {
    public int getMoneyAmount(int n) {
        int[][] dp = new int[n+10][n+10];

        for (int Len = 2; Len <= n; Len++) {
            for (int i = 1; i+Len-1 <= n; i++) {
                int right = i + Len - 1;
                if (right > n) break;
                dp[i][right] = Integer.MAX_VALUE;
                for (int k = i; k <= right; k++) {
                    dp[i][right] = Math.min(dp[i][right] , k + Math.max(dp[i][k-1],dp[k+1][right]));
                }
            }
        }

        return dp[1][n];
    }
}
